/*
 * ServidorCertificado.java
 *
 * Created on 30 de Maio de 2007, 10:48
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package qvoipm.sistema;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import qvoipm.base.BD;
import qvoipm.dados.Certificado;
import qvoipm.dados.Inicio;
import qvoipm.dados.Pacote;

/**
 *
 * @author rodrigo
 */
public class ServidorCertificado implements Runnable{
    
    public int porta;
    private boolean rodando;
    
    public ServidorCertificado(int porta) {
	this.porta = porta;
    }
    
    /**
     * Manda o servidor parar, mas nao
     * garante que vai parar ja que
     * pode estar preso em uma tentativa
     * de conexao
     */
    public void parar()
    {
	rodando = false;
    }
    
    public void run() {
	
	ServerSocket serverSocket = null;
	Socket socket;
	InputStream in;
	OutputStream out;
	byte buffer[] = new byte[Inicio.SIZE];
	
	/* Cria pacotes */
	Inicio inicio = new Inicio();	
	Certificado certificado = new Certificado();
	
	try {
	    serverSocket = new ServerSocket(porta);
	} catch (IOException ex) {
	    ex.printStackTrace();
	    return;
	}
	
	try {
	    
	    rodando = true;
	    while (rodando) {
		
		/* aguarda conexao */
		socket = serverSocket.accept();
		
		/* Cria reader */
		in = socket.getInputStream();
		
		/* Cria writer */
		out = socket.getOutputStream();
		
		/* Recebe pacote de requisição */
		int id = in.read();
		switch (id) {
		    case Inicio.ID:
			/* pacote de inicio. le pacote */
			in.read(buffer);
			
			/* Seta pacote */
			inicio.fromBytes(buffer, false);
			
		    /* Cria acesso no banco de dados e
		       cria certficiado */
			certificado.setChamada(BD.novaChamada(inicio));
			
			/* Envia certificado */
			out.write(certificado.toBytes(true));
			break;
		    case Pacote.TERMINAR_SERVIDOR:
			rodando = false;
			break;
		    default:
			System.err.println("QVOIPM: Certificado: Pacote " + id + " recebido do cliente invalido:");
			System.err.println(socket.getInetAddress() + ":" + socket.getPort());
			break;
		}
		
		/* desconecta */
		in.close();
		out.close();
		socket.close();
		
		/* Coleta lixo */
		System.gc();
	    }
	} catch (IOException ex) {
	    ex.printStackTrace();
	}
    }
}
